# https://movie.douban.com/
# 目标
# 获取选电影页面的数据


# 分析
# 起始url  https://movie.douban.com/j/search_subjects?
# 请求方式  get方法
# 参数分析
# type=movie
# tag=热门
# sort=recommend  热度排序
# page_limit=20   获取几条数据
# page_start=0    从第几条开始


# 步骤
# 1.准备起始的url和请求头信息
# 2.发送请求获取响应
# 3.获取响应数据  提取数据
# 4.保存数据
# 5.开启爬虫

# 只提取电影的如下字段

# 代码
import json

import requests


class DouBan:
    def __init__(self, start=0, limit=20):
        # 1.准备起始的url和请求头信息
        self.url = 'https://movie.douban.com/j/search_subjects'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
        }
        self.params = {
            'type': 'movie',
            'tag': '热门',
            'sort': 'recommend',
            'page_limit': limit,
            'page_start': start,
        }

    def get_data(self):
        # 发送请求获取响应
        response = requests.get(self.url, headers=self.headers, params=self.params)
        return response.content.decode('utf-8')

    def parse_data(self, data):
        # 解析数据
        data_dict = json.loads(data)
        # 获取电影列表数据
        data_list = data_dict.get('subjects')
        # print(data_list)
        # 定义一个新列表  保存提取后的数据
        data_list_new = []
        # 遍历列表  提取电影名字 连接  和评分
        for d in data_list:
            # 每一次循环  生成一个字典  存放提取的数据
            temp_dict = {}
            temp_dict['rate'] = d.get('rate')
            temp_dict['title'] = d.get('title')
            temp_dict['url'] = d.get('url')
            # 把字典保存到新的列表中
            data_list_new.append(temp_dict)
        return data_list_new

    def save_data(self, data_list):
        # 保存数据  data_list是电影的列表数据
        with open('douban_movie.json', 'a', encoding='utf-8')as f:
            for d in data_list:
                f.write(json.dumps(d, ensure_ascii=False)+',\n')

    def start(self):
        data = self.get_data()
        data_list = self.parse_data(data)
        self.save_data(data_list)


if __name__ == '__main__':
    d = DouBan(start=0, limit=50)
    d.start()



